εTrucos Pascal εBy Skynet ε======================================================================= Seguro que muchas veces, el Pascal os ha mostrado un mensaje de "out of memory", o de "Stack overflow"... y no se puede solucionar utilizando memoria dinámica (punteros) porque las variables ocupan mas de 64 Kb. Bueno, esto podrías solucionarlo utilizando el modo protegido, y no haciendo el gili con el modo real. (Modo DPMI, extensor 4GW, etc). Pero existe un método que podrá darte 256 Kb!!!! :) (No es gracias a Dios ni hostias similares... :-) ). En primer lugar, el Pascal debe ser el Borland Pascal 6.0 o superior, y debéis tener mas de 450 kb. libres de base. φComo obtener 256 Kb. sin utilizar XMS φ===================================== Estas funciones son las que debéis utilizar: ΓFunction DosMaxMem : longint; assembler; Ω{ Devuelve el tamaño del segmento mas largo de memoria. Esta funcion deberia Ω ser llamada unicamente mientras HeapMin/HeapMax esten a 0 } ΓAsm Ω{Jodete Watcom!!!} Γ MOV BX,0FFFFh Γ MOV AH,48h Γ INT 21h Ω { El 48h nos muestra la memoria } Γ MOV AX,BX Γ MOV BX,16 Γ MUL BX ΓEnd; ΓFunction MemAlloc(Size : longint) : pointer; assembler; Ω{ Crea una variable dinamica del tamaño especificado y devuelve el puntero Ω hacia ella. Esta funcion deberia ser ejecutada solo cuando HeapMin/HeapMax Ω esten parametrados a 0 } ΓAsm Ω{Jodete Pascal 5.0!!!} Γ@@1: Γ MOV AX,WORD PTR [Size] Γ MOV DX,WORD PTR [Size+2] Γ MOV CX,16 Γ DIV CX Γ INC AX Γ MOV BX,AX Γ MOV AH,48h Γ INT 21h Γ JNC @@2 Γ XOR AX,AX Γ@@2: Γ MOV DX,AX Γ XOR AX,AX ΓEnd; ΓProcedure MemFree(P : pointer); assembler; Ω{ Libera una variable dinamica dada. Solo ejecutar idem antes } ΓAsm Ω{Jodete ADA!} Γ MOV ES,WORD PTR [P+2] Γ MOV AH,49h Γ INT 21h ΓEnd; ΓFunction MemRealloc(P : pointer; NewSize : longint) : pointer; assembler; Ω{ Cambia el tamaño del bloque de memoria. Idem que siempre} ΓAsm Ω{Jodete BASIC!} Γ@@1: Γ MOV AX,WORD PTR [NewSize] Γ PUSH AX Γ MOV DX,WORD PTR [NewSize+2] Γ PUSH DX Γ MOV CX,16 Γ DIV CX Γ INC AX Γ MOV BX,AX Γ MOV AH,4Ah Γ INT 21h Γ POP DX Γ POP AX Γ JNC @@2 Γ XOR DX,DX Γ XOR AX,AX Γ@@2: ΓEnd; Ω{Definimos como pila una virutilla de memoria! :) } Ω{$M 4096,0,0} Γconst MemToAlloc = 256 * 1024; { 256kb. } ΓVar MemoryBlock : pointer; ΓBegin Γ if DosMaxMem >= MemToAlloc then Γ begin Γ WriteLn('Memoria libre en DOS antes de instalarse', Γ MemToAlloc shr 10, 'kb: ', DosMaxMem shr 10, 'kb.'); Γ MemoryBlock := MemAlloc(MemToAlloc); Γ WriteLn('Memoria libre DOS después de instalarse', Γ MemToAlloc shr 10, 'kb: ', DosMaxMem shr 10, 'kb.'); Γ { Si MemoryBlock = nil entonces la hemos cagado... :) } Γ MemFree(MemoryBlock) Γ end else WriteLn('Joder tio, no te funciona!', Γ (MemToAlloc - DosMaxMem) shr 10, 'kb mas necesitados.') ΓEnd. Y con este mini-programa que podemos convertir a unidad, quedan "casi" solucionados los problemas para almacenamiento de variables. Hay un truco mas complicado para conseguir 1 Mb. con arrays de 64 Kb, pero eso es otra historia.... φPregunta: φ========== ¿Os pasa que de vez en cuando "quiteais" (salir) el Pascal en modo traza de programas vía SHELL, os imprime "666" en la pantalla? Lo digo, porque no se que cojones puede ser... (no puede ser un virus, y tampoco un residente, ni el buffer...). ∞======================================================================= ∞Skynet Rulez! ∞amarfer@alufis34.ffisic.uv.es